Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 7df2a69b4bf6a7cf1e4b183ffa6a4d619584b81c


Parents : d5231da
Author : Mark Qvist <mark@unsigned.io>
Date : 2022-10-08T22:47:08+02:00

Added periodic sync. Improved sync dialog UI.

Changes

3 files changed, 91 insertions(+), 13 deletions(-)

M sbapp/main.py +39 -5

Diff

diff --git a/sbapp/main.py b/sbapp/main.py
index 6bd5b3f1..87ed1b75 100644
--- a/sbapp/main.py
+++ b/sbapp/main.py
@@ -1,3 +1,4 @@
+# TODO: Reset
__debug_build__ = True
__disable_shaders__ = True
__version__ = "0.2.2"
@@ -65,9 +66,10 @@ else:
from .ui.messages import Messages, ts_format
from .ui.helpers import ContentNavigationDrawer, DrawerList, IconListItem
-from kivy.metrics import dp
-from kivymd.uix.button import MDFlatButton
+from kivy.metrics import dp, sp
+from kivymd.uix.button import MDFlatButton, MDRectangleFlatButton
from kivymd.uix.dialog import MDDialog
+from kivymd.color_definitions import colors
dark_theme_text_color = "ddd"
@@ -178,12 +180,24 @@ class SidebandApp(MDApp):
else:
self.theme_cls.theme_style = "Light"
+ self.update_ui_colors()
+
+ def update_ui_colors(self):
+ if self.sideband.config["dark_ui"]:
+ self.color_reject = colors["DeepOrange"]["900"]
+ self.color_accept = colors["LightGreen"]["700"]
+ else:
+ self.color_reject = colors["DeepOrange"]["800"]
+ self.color_accept = colors["LightGreen"]["700"]
+
def update_ui_theme(self):
if self.sideband.config["dark_ui"]:
self.theme_cls.theme_style = "Dark"
else:
self.theme_cls.theme_style = "Light"
+ self.update_ui_colors()
+
st = time.time()
RNS.log("Recursing widgets...")
for wid in self.root.ids:
@@ -311,6 +325,12 @@ class SidebandApp(MDApp):
self.sync_dialog.ids.sync_progress.value = self.sideband.get_sync_progress()*100
self.sync_dialog.ids.sync_status.text = self.sideband.get_sync_status()
+ state = self.sideband.message_router.propagation_transfer_state
+ if state > LXMF.LXMRouter.PR_IDLE and state < LXMF.LXMRouter.PR_COMPLETE:
+ self.widget_hide(self.sync_dialog.stop_button, False)
+ else:
+ self.widget_hide(self.sync_dialog.stop_button, True)
+
elif self.root.ids.screen_manager.current == "announces_screen":
if self.sideband.getstate("app.flags.new_announces"):
if self.announces_view != None:
@@ -674,27 +694,40 @@ class SidebandApp(MDApp):
else:
sl = None
+ self.sideband.setpersistent("lxmf.lastsync", time.time())
+ self.sideband.setpersistent("lxmf.syncretrying", False)
self.sideband.request_lxmf_sync(limit=sl)
- close_button = MDFlatButton(text="Close", font_size=dp(20))
- # stop_button = MDFlatButton(text="Stop", font_size=dp(20))
+ # , font_size=dp(20)
+ close_button = MDRectangleFlatButton(text="Close",font_size=sp(18))
+ stop_button = MDRectangleFlatButton(text="Stop",font_size=sp(18), theme_text_color="Custom", line_color=self.color_reject, text_color=self.color_reject)
dialog_content = MsgSync()
dialog = MDDialog(
title="LXMF Sync via "+RNS.prettyhexrep(self.sideband.message_router.get_outbound_propagation_node()),
type="custom",
content_cls=dialog_content,
- buttons=[ close_button ],
+ buttons=[ stop_button, close_button ],
# elevation=0,
)
dialog.d_content = dialog_content
def dl_close(s):
self.sideband.setstate("app.flags.lxmf_sync_dialog_open", False)
dialog.dismiss()
+ # self.sideband.cancel_lxmf_sync()
+
+ def dl_stop(s):
+ # self.sideband.setstate("app.flags.lxmf_sync_dialog_open", False)
+ # dialog.dismiss()
self.sideband.cancel_lxmf_sync()
+ def cb(dt):
+ self.widget_hide(self.sync_dialog.stop_button, True)
+ Clock.schedule_once(cb, 0.25)
close_button.bind(on_release=dl_close)
+ stop_button.bind(on_release=dl_stop)
self.sideband.setstate("app.flags.lxmf_sync_dialog_open", True)
self.sync_dialog = dialog_content
+ self.sync_dialog.stop_button = stop_button
dialog.open()
dialog_content.ids.sync_progress.value = self.sideband.get_sync_progress()*100
dialog_content.ids.sync_status.text = self.sideband.get_sync_status()
@@ -854,6 +887,7 @@ class SidebandApp(MDApp):
self.root.ids.settings_lxmf_sync_periodic.text = "Auto sync every "+interval_text
if pre != self.root.ids.settings_lxmf_sync_periodic.text:
if save:
+ self.sideband.config["lxmf_sync_interval"] = interval
self.sideband.save_configuration()
self.root.ids.settings_lxmf_address.text = RNS.hexrep(self.sideband.lxmf_destination.hash, delimit=False)

diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py
index 7c326483..9bc3285b 100644
--- a/sbapp/sideband/core.py
+++ b/sbapp/sideband/core.py
@@ -63,7 +63,9 @@ class SidebandCore():
MAX_ANNOUNCES = 24
- JOB_INTERVAL = 1
+ SERVICE_JOB_INTERVAL = 1
+ PERIODIC_JOBS_INTERVAL = 60
+ PERIODIC_SYNC_RETRY = 360
aspect_filter = "lxmf.delivery"
def received_announce(self, destination_hash, announced_identity, app_data):
@@ -929,10 +931,46 @@ class SidebandCore():
def _service_jobs(self):
if self.is_service:
while True:
- time.sleep(SidebandCore.JOB_INTERVAL)
+ time.sleep(SidebandCore.SERVICE_JOB_INTERVAL)
if self.getstate("wants.announce"):
self.lxmf_announce()
+ def _periodic_jobs(self):
+ if self.is_service or self.is_standalone:
+ while True:
+ time.sleep(SidebandCore.PERIODIC_JOBS_INTERVAL)
+ if self.config["lxmf_periodic_sync"] == True:
+ if self.getpersistent("lxmf.lastsync") == None:
+ # TODO: Remove
+ RNS.log("Lastsync was none, setting now as initial", RNS.LOG_DEBUG)
+ self.setpersistent("lxmf.lastsync", time.time())
+ else:
+ now = time.time()
+ syncinterval = self.config["lxmf_sync_interval"]
+ lastsync = self.getpersistent("lxmf.lastsync")
+ nextsync = lastsync+syncinterval
+
+ RNS.log("Last sync was "+RNS.prettytime(now-lastsync)+" ago", RNS.LOG_DEBUG)
+ RNS.log("Next sync is "+("in "+RNS.prettytime(nextsync-now) if nextsync-now > 0 else "now"), RNS.LOG_DEBUG)
+ if now > nextsync:
+ # TODO: Remove
+ RNS.log("Syncing now...", RNS.LOG_DEBUG)
+ if self.request_lxmf_sync():
+ RNS.log("Scheduled LXMF sync succeeded", RNS.LOG_DEBUG)
+ self.setpersistent("lxmf.lastsync", time.time())
+ self.setpersistent("lxmf.syncretrying", False)
+ else:
+ if not self.getpersistent("lxmf.syncretrying"):
+ RNS.log("Scheduled LXMF sync failed, retrying in "+RNS.prettytime(SidebandCore.PERIODIC_SYNC_RETRY), RNS.LOG_DEBUG)
+ self.setpersistent("lxmf.lastsync", lastsync+SidebandCore.PERIODIC_SYNC_RETRY)
+ self.setpersistent("lxmf.syncretrying", True)
+ else:
+ RNS.log("Retry of scheduled LXMF sync failed too, waiting until next scheduled sync to try again", RNS.LOG_DEBUG)
+ self.setpersistent("lxmf.lastsync", time.time())
+ self.setpersistent("lxmf.syncretrying", False)
+
+
+
def __start_jobs_deferred(self):
if self.config["start_announce"]:
self.lxmf_announce()
@@ -940,6 +978,10 @@ class SidebandCore():
if self.is_service:
self.service_thread = threading.Thread(target=self._service_jobs, daemon=True)
self.service_thread.start()
+
+ if self.is_standalone or self.is_service:
+ self.periodic_thread = threading.Thread(target=self._periodic_jobs, daemon=True)
+ self.periodic_thread.start()
def __start_jobs_immediate(self):
if self.log_verbose:

diff --git a/sbapp/ui/layouts.py b/sbapp/ui/layouts.py
index 5475a8a2..19734a5b 100644
--- a/sbapp/ui/layouts.py
+++ b/sbapp/ui/layouts.py
@@ -71,13 +71,14 @@ MDNavigationLayout:
MDIconButton:
pos_hint: {"center_x": .5, "center_y": .5}
- icon: "close-network-outline"
+ # icon: "close-network-outline"
+ icon: "waves"
icon_size: "72dp"
MDLabel:
id: connecting_info
halign: "center"
- text: "Shutting down..."
+ text: "Dissolving Reticulum"
font_size: "32dp"
size_hint_y: None
text_size: self.width, None
@@ -1117,17 +1118,18 @@ MDNavigationLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
+ padding: [0, 0, 0, dp(16)]
height: self.minimum_height+dp(24)
+ MDProgressBar:
+ id: sync_progress
+ value: 0
+
MDLabel:
id: sync_status
hint_text: "Name"
text: "Initiating sync..."
- MDProgressBar:
- id: sync_progress
- value: 0
-
<ConvSettings>
orientation: "vertical"
spacing: "24dp"


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────